package com.lx.controller;


import com.lx.annotation.MyCache;
import com.lx.domin.SystemInfo;
import com.lx.service.SystemService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.method.HandlerMethod;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 分布式缓存
 */
@RestController
@RequestMapping("/system")
public class SystemController {
    @Autowired
    private SystemService systemService;
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * @return 效率较低 每一次查询都要到数据库当中去查
     * 如果该接口的调用频率很高 有高并发的应用场景（这个查询速度就会非常的满）
     * 数据库的压力也会更大
     */

    //加入redis缓存的技术点进行优化
    @RequestMapping("/getSystemInfo")
    public List<SystemInfo> getSystemInfo() {
        /**
         * 分布式缓存思路：
         * 第一步不能直接查数据库
         * 先去redis当中查询 如果有直接返回
         * 如果没有 再去数据库当中去查
         * 并且将查到的数据返回给前端的同时
         * 在redis当中也存入一份
         */
        //1.查询Redis当中是否有数据
        String key = "system:systemInfo";
        List<SystemInfo> data = (List<SystemInfo>) redisTemplate.opsForValue().get(key);
        //2.如果有直接返回前端
        if (data != null) {
            System.out.println("从redis当中去查询数据");
            return data;
        } else {
            //没有数据 查数据库
            System.out.println("从数据库当中去获取系统数据");
            List<SystemInfo> list = systemService.getSystemInfo();
            //并且将查到的数据返回给前端 在redis当中也存入一份
            redisTemplate.opsForValue().set(key, list);
            //可以省略 给key值设置一个有效期限
            redisTemplate.expire(key, 60, TimeUnit.SECONDS);
            return list;
        }
    }

    @RequestMapping("/getSystemInfo02")
    @MyCache(key = "zhujie",cacheName = "ceshi")
    public List<SystemInfo> getSystemInfo2() {
        System.out.println("查询数据库");
        List<SystemInfo> list = systemService.getSystemInfo();
        return list;

    }
}
